SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
1.9 KB · 44 lines typescript
Raw Blame History
1// Rétroaction sur un message : 👍/👎, signalement, sauvegarde en bibliothèque.2import { NextResponse } from "next/server";3import { z } from "zod";4import { apiError, parseBody } from "@/lib/api.ts";5import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts";6import { get, run } from "@/lib/db/index.ts";78const schema = z.object({9  feedback: z.union([z.literal(-1), z.literal(0), z.literal(1)]).optional(),10  flag: z.boolean().optional(),11  flagReason: z.string().max(500).optional(),12  save: z.boolean().optional(),13});1415export async function PATCH(req: Request, ctx: { params: Promise<{ id: string }> }) {16  try {17    await assertSameOrigin();18    const user = await requireUser();19    const id = parseInt((await ctx.params).id, 10);20    const msg = get<{ id: number; conversation_id: number; content: string; user_id: number; course_code: string | null }>(21      `SELECT m.id, m.conversation_id, m.content, c.user_id, c.course_code FROM messages m22       JOIN conversations c ON c.id = m.conversation_id WHERE m.id = ?`,23      id24    );25    if (!msg || msg.user_id !== user.id) return NextResponse.json({ error: "Message introuvable." }, { status: 404 });26    const body = await parseBody(req, schema);27    if (body.feedback !== undefined) run("UPDATE messages SET feedback = ? WHERE id = ?", body.feedback, id);28    if (body.flag) {29      run("UPDATE messages SET flagged = 1 WHERE id = ?", id);30      run("INSERT INTO report_flags (message_id, user_id, reason) VALUES (?, ?, ?)", id, user.id, body.flagReason ?? "");31    }32    if (body.save) {33      run("UPDATE messages SET saved = 1 WHERE id = ?", id);34      run(35        "INSERT INTO saved_items (user_id, kind, course_code, title, content, meta) VALUES (?, 'answer', ?, ?, ?, ?)",36        user.id, msg.course_code, msg.content.replace(/\s+/g, " ").slice(0, 80), msg.content, JSON.stringify({ messageId: id })37      );38    }39    return NextResponse.json({ ok: true });40  } catch (e) {41    return apiError(e);42  }43}44